package Day09;

import java.util.Scanner;

/*万年历 输入一个年份，再输入一个月份，把那个月的日历打印出来，（1900年1月1日是星期一）。
        * a：先输出提示语句，并接受用户输入的年、月。
        * b：根据用户输入的年，先判断是否是闰年。(闰年2月有29天,平年2月有28天);
        * C：根据用户输入的月来判断月的天数。
        * D：用循环计算用户输入的年份距1900年1月1日(星期一)的总天数。
        * E：用循环计算用户输入的月份距输入的年份的1月1日共有多少天。*
        * F：相加D与E的天数，得到总天数。
        * G：用总天数来计算输入月的第一天的星期数。
        * H：根据G的值，格式化输出这个月的日历！
        * * H提示:
        * 1.如果当月1日如果不是周日先打印第一行,再打印后面的
        *  (1)startDay=0~5,先打印若干个空格,startDay==0时,是星期一,应该在星期日处打印一个空格,以此类推[0~startDay+1)
        *  (2)再打印第一行的日期[1,7-startDay)
        *  (3)打印换行
        *  (4)第一行打印的天数为:1~(6-startDay),所以第二行从7-startDay开始打印,打印到当月总天数为止,每7个换行
        * 2.如果startDay是6(周日),直接从1日开始打印到最后一天,每7个换行 提示:当月1日如果不是周日,应循环输出\t以便对齐
        *  当月1日的星期数加上日期的号,如果能被7整除,则应换行.
 */
public class Demo03 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (true) {
            System.out.println();
            System.out.println("请输入年份：");
            int year = in.nextInt();
            System.out.println("请输入月份：");
            int month = in.nextInt();
            int yearSum = yearSum(year);
            int monthSum = monthSum(year, month);
            int daySum = yearSum + monthSum;
            int oneDay = whatDay(daySum + 1);
            System.out.println("\t" + "\t" + "\t" + year + "年" + month + "月");
            System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
            print(year, month, oneDay);
        }
    }

    private static int whatDay(int daySum) {
        // 判断该日为星期几

        int whatDay = 0;
        if (daySum % 7 == 0) {
            whatDay = 7;
        } else {
            whatDay = daySum % 7;
        }
        return whatDay;

    }

    //判断该年份1月1日到1900年1月1日的总天数
    public static int yearSum(int year) {
        int yearSum = 0;
        if (year < 1900) {
            System.out.println("请输入大于1900年的年份：");
        } else {
            for (int i = 1900; i < year; i++) {
                if (isLeapYear(i)) {
                    yearSum += 366;
                } else {
                    yearSum += 365;
                }
            }
        }
        return yearSum;
    }

    //判断该月份到1月1日的总天数
    public static int monthSum(int year, int month) {
        int monthSum = 0;
        if (month < 0 || month > 12) {
            System.out.println("请输入1~12的正确月份：");
        } else {
            for (int i = 1; i < month; i++) {
                monthSum += monthNumber(year, i);

            }
        }
        return monthSum;
    }


    //判断是否为闰年
    public static boolean isLeapYear(int year) {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
            return true;
        } else {
            return false;
        }
    }

    //判断月份天数
    public static int monthNumber(int year, int month) {
        int monthNumber = 0;
        switch ((month)) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                monthNumber = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                monthNumber = 30;
                break;
            case 2: {
                if (isLeapYear(year)) {
                    monthNumber = 29;
                } else {
                    monthNumber = 28;
                }
                break;
            }
        }
        return monthNumber;
    }

        //打印日历
        public static void print( int year,int month,int oneDay){
            // 打印空格
            for (int i = 0; i < oneDay; i++) {
                System.out.print("" + "\t");
            }
            int day = monthNumber(year, month);
            for (int i = 1; i <= day; i++) {
                if ((oneDay + i - 1) % 7 == 0) {
                    System.out.println();
                }
                System.out.print(" " + i + "\t");
            }
        }

    }
